const express = require('express')
//SQLite 是一款轻量级数据库
const sqlite = require('sqlite3')
//创建应用对象
const app = express()
const port = 8000
//通过 express.urlencoded() 中间件，来解析表单的 url-encoded 格式的数据 
app.use(express.urlencoded({ extended: false }))
//解析 JSON 格式的请求体数据
app.use(express.json())

//初始化数据库：userAccount.db 为配置数据存储的文件名称，通过回调函数 (e)=>{} 进行建表操作
const db = new sqlite.Database('userAccount.db', (e) => {

  db.run("create table member(id char(5),name varchar(30),tel varchar(10),gender varchar(5),tec varchar(10),like varchar(10),introduce varchar(30))", 
  function () {
    app.post('/member', (req, res) => {
      //解析变量通过解构赋值
      const { name, tel, gender, tec, like, introduce} = req.body
      db.run(`insert into member values('${Date.parse(new Date())}','${name}','${tel}','${gender}','${tec}','${like}','${introduce}')`, function (err, result) {
        if (err) {
          //JSON.stringify() 将一个JS值（对象或者数组），转换一个JSON字符串
          res.send(JSON.stringify({ status: "error" }))
        }
        else {
          res.send(JSON.stringify({ status: "success" }))
        }
      })

    })
    
    app.get('/member',(request,res)=>{
      db.all(`select * from member`, function (err, result) {
        if (err) {
          res.send(JSON.stringify({ status: "error" }))
          return
        }
        if (Object.keys(result).length) {
          //console.log(result)
          res.send(JSON.stringify({...result}))
        }
        else {
          res.send(JSON.stringify({}))
        }
      });
    })
  })
  //表2
  db.run("create table question(id char(15),names varchar(30),title varchar(30),content varchar(250))", function () {
    app.post('/content', (req, res) => {
      //解析变量通过解构赋值
      const { names, title, content } = req.body
      //console.log(`title=${title}  content=${content}`)
      db.run(`insert into question values('${Date.parse(new Date())}','${names}','${title}','${content}')`, function (err, result) {
        if (err) {
          //JSON.stringify() 将一个JS值（对象或者数组），转换一个JSON字符串
          res.send(JSON.stringify({ status: "error" }))
        }
        else {
          res.send(JSON.stringify({ status: "success" }))
        }
      })

    })
    
    app.get('/data',(request,res)=>{
      db.all(`select * from question`, function (err, result) {
        if (err) {
          res.send(JSON.stringify({ status: "error" }))
          return
        }
        if (Object.keys(result).length) {
          //console.log(result)
          res.send(JSON.stringify({...result}))
        }
        else {
          res.send(JSON.stringify({}))
        }
      });
    })
  })
  //表3
  //sqlite3 提供的执行 sql 语句的方法 run 可以实现数据的增 删 改。
  //run() 接收三个参数 run(sql(需要执行的语句),value(sql语句需要替换的值),callback(执行后的回调函数))
  //这里只接收一个回调函数作为参数
  db.run("create table user_account(id varchar(15),username varchar(15),account varchar(20),password varchar(20))", function () {
    //创建路由规则 采用 post 方法请求，接收一个带参的回调函数作为参数，
    //其中回调函数的两个参数（数据类型为对象）分别是请求报文和响应报文的封装。
    app.post('/sign_up', (req, res) => {
      const { username, account, password } = req.body
      db.run(`insert into user_account values('${Date.parse(new Date())}','${username}','${account}','${password}')`, function (err, result) {
        if (err) {
          //JSON.stringify() 将一个JS值（对象或者数组），转换一个JSON字符串
          res.send(JSON.stringify({ status: "error" }))
        }
        else {
          res.send(JSON.stringify({ status: "success" }))
        }
      })
    })

    //登陆
    app.post('/sign_in', (req, res) => {
      const { account, password } = req.body
      db.all(`select username from user_account where account=${account} and password=${password}`, function (err, result) {
        if (err) {
          console.log(err)
          res.send(JSON.stringify({ status: "error" }))
          return
        }
        if (Object.keys(result).length) {
          res.send(JSON.stringify({ status: "old_user", ...result[0] }))
        }
        else {
          res.send(JSON.stringify({ status: "new_user" }))
        }
      });
    })


  });

   //表4
 db.run("create table question1(id char(15),title varchar(30),content varchar(250))", function () {
  app.post('/content1', (req, res) => {
    //解析变量通过解构赋值
    const { title, content } = req.body
    //console.log(`title=${title}  content=${content}`)
    db.run(`insert into question1 values('${Date.parse(new Date())}','${title}','${content}')`, function (err, result) {
      if (err) {
        //JSON.stringify() 将一个JS值（对象或者数组），转换一个JSON字符串
        res.send(JSON.stringify({ status: "error" }))
      }
      else {
        res.send(JSON.stringify({ status: "success" }))
      }
    })

  })
  app.get('/data1',(request,res)=>{
    db.all(`select * from question1`, function (err, result) {
      if (err) {
        res.send(JSON.stringify({ status: "error" }))
        return
      }
      if (Object.keys(result).length) {
        //console.log(result)
        res.send(JSON.stringify({...result}))
      }
      else {
        res.send(JSON.stringify({}))
      }
    });
  })
})

})
app.listen(port, () => console.log(`Example app listening on port ${port}!`))